import java.util.Arrays;

class MyArray2<T>{
    /*
    public T[] array = new T[10];
    在Java中不允许实例化一个泛型数组，因为数组在Java中也是一种特殊的数据类型
     */
    public T[] array = (T[]) new Object[10];//这样写就是把Object类进行强制转化为T类型数组。

    public void setArray(int pos,T val) {
        array[pos] = val;
    }

    /*
    main1；
    public T[] getArray() {
        return this.array;
    }*/

    //main:
    public T[] getArray() {
        return (T[]) this.array;//强制转化为T类型的数组，因为T未被定义那种类型，所以我们用object类型来接收
    }
}
public class TestW {
    //泛型是如何去编译的
    public static void main1(String[] args) {
        MyArray2<String> myArray2 = new MyArray2<>();
        myArray2.setArray(0,"hello");
        String[] ret = (String[]) myArray2.getArray();//这个时候用String类型转化，也是无用功
        System.out.println(Arrays.toString(ret));
        //这个时候就会发生类型转换异常
        //数组不能整体进行强制转换，object类型同时可以存入多种数据类型的数据，所以强制转换不能确定元素类型，所以我们要注重于安全性
        //Ljava.lang.Object表示object数组，因为泛型被擦除后就保留了原有类型
        //[Ljava.lang.String;不能变为String类型
    }

    public static void main(String[] args) {
        MyArray2<String> myArray2 = new MyArray2<>();
        myArray2.setArray(0,"hello");
        Object[] ret = myArray2.getArray();//用object类型来接收
        System.out.println(Arrays.toString(ret));
        //遇到了这种情况我们用这来实现接收，当然强转要通过，必须实例化一个具体类型的数组
    }
}
/*
泛型机制：在编译的时候将所有的T都擦除为object类型，
运行的时候，没有泛型的这种概念-->泛型的擦除机制，只是存在于编译期间
 */
/*
为什么不能实例化泛型类型数组？
因为有擦除机制的存在，会导致返回数组整体的时候会发生报错，这个时候是因为无法准确的确定数组元素中的具体类型
 */

//通俗的讲：
//返回的Object数组里面，可能存放的是任何的数据类型，可能是String，可能是Person，运行的时
//候，直接转给Integer类型的数组，编译器认为是不安全的